#include <iostream>

class Base
{
public:
    virtual void show() //虚函数
    {
        std::cout<<"Base\n";
    }
};

class Derived1 : public Base
{
public:
    void show() //子类函数和父类函数完全相同：重写
    {
        std::cout<<"Derived1\n";
    }
};

class Derived2 : public Base
{
public:
    void show()
    {
        std::cout<<"Derived2\n";
    }

};


int main()
{
    Derived1 *d1 = new Derived1;
    Derived2 *d2 = new Derived2;
    
    // d1->show();
    // d2->show();

    //c++允许将子类指针转成基类指针 ： 向上转型
    Base *b = d1;
    b->show();
    b = d2;
    b->show();

    //Derived1 *t = b1;//向下转型，不被允许

    //多态：同一句代码，不同的功能
    //c++多态：
    //1、基类指针指向子类对象
    //2、基类定义虚函数
    //3、子类重写父类虚函数

    //重写 和 名词遮蔽
    
    //虚函数为什么能实现多态？
    // 虚函数指针 和 虚函数表
    return 0;
}